package com.dy.design_pattern_study.command_pattern.dome3;

import com.dy.design_pattern_study.command_pattern.dome3.impl.ConcreteCommand;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-04-19
 * @Content 命令模式（Command），将一个请求封装为一个对象，
 * 从而使你可用不同的请求对客户进行参数化；对请求排队或记录请求日志，以及支持可撤销的操作
 * <p>
 * 简单的说，命令模式实质就是命令的发送与通知，还有撤销、重做功能
 * 跟观察者模式是类似的，不同的是
 * 命令模式可以撤销、重做通知，但观察者模式，仅是有消息就直接进行通知
 * <p>
 * 命令模式的优点
 * 1.它能较容易地设计一个命令队列；
 * 2.在需要的情况下，可以较容易地将命令记入日志；
 * 3.允许接收请求的一方决定是否要否决请求。
 * 4.可以容易地实现对请求的撤销和重做；
 * 5.由于加进新的具体命令类不影响其他的类，因此增加新的具体命令类很容易。
 * 6.命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开
 * <p>
 * p.s.
 * 不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式，
 * 一般就不要着急去实现它，事实上，在需要的时候通过重构实现这个模式并不困难，
 * 只有在真正需要如撤销/恢复操作等功能时，把原来的代码重构为命令模式才有意义
 */
public class client {
    public static void main(String[] args) {
        Receiver r = new Receiver();
        Command c = new ConcreteCommand(r);
        Invoker i = new Invoker();

        //设置命令
        i.SetCommand(c);
        //通知执行
        i.executeCommand();
    }
}
